package com.wei.czz.framework.admin.service;

import com.wei.czz.common.dto.admin.UserDto;
import com.wei.czz.common.dto.common.NameValue;
import com.wei.czz.common.tool.PageDto;
import com.wei.czz.common.vo.admin.deptUser.DeptUserFormVo;
import com.wei.czz.common.vo.admin.userRole.UserRoleFormVo;
import com.wei.czz.common.vo.admin.userRoleGroup.UserRoleGroupFormVo;
import com.wei.czz.common.vo.admin.user.UserFormVo;
import com.wei.czz.framework.admin.entity.UserEntity;
import org.springframework.lang.NonNull;

import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.function.Function;

/**
 * Created by IntelliJ IDEA.
 *
 * @author wei
 * date: 2021-03-15 10:30:44
 * className: UserService 用户操作请求服务接口
 * version: 1.0
 * description:
 */
public interface UserService {

    /**
     * 保存用户操作
     * @param user 用户对象
     */
    void saveOrEdit(UserEntity user);

    /**
     * 批量保存用户操作
     * @param userList 用户对象列表
     */
    void batchSave(List<UserEntity> userList);

    /**
     * 分页获取用户操作
     * @param deptUserFormVo 参数对象
     * @return 用户分页数据
     */
    PageDto<UserEntity> getPageList(DeptUserFormVo deptUserFormVo);

    /**
     * 分页获取角色授权组关联用户操作
     * @param formVo 参数对象
     * @return 用户分页数据
     */
    PageDto<UserEntity> getUserRoleGroupPageList(UserRoleGroupFormVo formVo);

    /**
     * 分页获取角色关联用户操作
     * @param formVo 参数对象
     * @return 用户分页数据
     */
    PageDto<UserEntity> getRoleUserPageList(UserRoleFormVo formVo);

    /**
     * 获取全部用户操作
     * @return 用户列表
     */
    List<UserEntity> findUserList();

    /**
     * 获取用户数据操作
     * 根据用户主键列表，对应对应的用户数据
     * @param userIdList 用户主键列表
     * @return 用户数据
     */
    List<UserEntity> getList(List<Long> userIdList);

    /**
     * 获取用户操作
     * @param email     邮箱号
     * @param phone     手机号
     * @param loginName 登录别名
     * @return 用户列表
     */
    List<UserEntity> findUserList(String email, String phone, String loginName);

    /**
     * 获取用户列表操作
     * 只获取用户简单信息
     * @return 用户列表
     */
    List<UserDto> getSimpleUserList();

    /**
     * 分页查询用户缓存数据列表操作
     * @param cacheUserFormVo 用户缓存查询参数对象
     * @return 操作结果
     */
    Map<String, Object> getCacheUserList(UserFormVo cacheUserFormVo);

    /**
     * 根据用户id，获取用户数据操作
     * @param userId 用户id
     * @return 用户对象
     */
    UserEntity get(Long userId);

    /**
     * 获取用户缓存数据操作
     * @param userId 用户主键
     * @return 用户缓存信息对象
     */
    Map<String, Object> getUserCacheInfo(Long userId);

    /**
     * 获取用户名称映射操作
     * @param userIdCollection 用户主键集合
     * @param function         返回值key映射对象
     * @return 映射对象
     * @param <R> 泛型类型
     */
    <R> Map<R, String> getNameMap(Collection<Long> userIdCollection, @NonNull Function<Long, R> function);

    /**
     * 统计系统用户数操作
     * @return 用户数
     */
    Long getUserCount();

    /**
     * 获取用户封装列表操作
     * @param userIdSet 用户主键集合
     * @param function  value值映射对象
     * @return 用户列表
     * @param <R> 泛型类型
     */
    <R> List<NameValue<R>> findUserList(Set<Long> userIdSet, @NonNull Function<Long, R> function);

    /**
     * 判断用户手机号、邮箱号、登录别名是否存在操作
     * @param userId    用户主键
     * @param phone     手机号
     * @param email     邮箱号
     * @param loginName 登录别名
     */
    void checkLoginInfo(Long userId, String phone, String email, String loginName);

    /**
     * 修改用户密码操作
     * @param userId   用户主键
     * @param password 用户密码
     */
    void updatePassword(Long userId, String password);

    /**
     * 批量更新用户数据操作
     * @param userList 用户数据列表
     */
    void batchUpdate(List<UserEntity> userList);

    /**
     * 删除用户操作
     * @param userIdList 用户主键列表
     */
    void delete(List<Long> userIdList);
}

